package com.lvmama.java.rhino.spark.utils;

import jxl.Cell;
import jxl.Sheet;
import jxl.Workbook;
import jxl.read.biff.BiffException;

import java.io.File;
import java.io.IOException;
import java.net.URISyntaxException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;

/**
 * Excel解析工具
 * @Title: ExcelUtil.java
 * @Package com.lvmama.excel
 * @author wxliyong
 * @date 2016-1-14 下午8:35:03
 * @version V1.0.0
 */
public class ExcelUtil {
	
	/**
	 * 解析Excel，该API仅支持解析Excel2003版本的xls形式的文件<br>
	 * 格式：<br>
	 * List&lt;整个sheet的数据&gt; <br>
	 * List&lt;List&lt;整行的数据&gt;&gt;
	 * @param fileName Excel的文件名
	 * @author wxliyong
	 * @date 2016-1-14 下午9:17:32
	 */
	public static List<List<String[]>> parseExcel(String fileName) {
		// 用户存放excel数据 -- 格式：List<整个sheet的数据> List<List<整行的数据>>
		List<List<String[]>> result = new ArrayList<List<String[]>>();
		// Excel文件对象
		Workbook book = null;
		try {
			// 获取文件资源URL
			URL url = Thread.currentThread().getContextClassLoader().getResource(fileName);
			// Excel文件对象
			File file = new File(url.toURI());
			book = Workbook.getWorkbook(file);
			// 获取Excel中的所有sheet
			Sheet[] sheets = book.getSheets();
			// 遍历解析所有sheet
			for (int j = 0; j < sheets.length; j++) {
				// 存储一个Sheet中的数据对象
				List<String[]> sheetData = new ArrayList<String[]>();
				result.add(sheetData);
				Sheet sheet = sheets[j];
				int rows = sheet.getRows();
				// 遍历所有行，解析每一行数据
				for (int k = 0; k < rows; k++) {
					// 每一行中的所有列
					int columns = sheet.getColumns();
					String[] rowData = new String[columns];
					sheetData.add(rowData);
					// 遍历所有列，解析每一行中的每一列数据
					for (int i = 0; i < columns; i++) {
						Cell cell = sheet.getCell(i, k);
						String contents = (cell.getContents() == null ? "" : cell.getContents().trim());
						rowData[i] = contents;
					}
				}
			}
		} catch (BiffException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (URISyntaxException e) {
			e.printStackTrace();
		} finally {
			if (null != book) {
				book.close();
			}
		}
		return result;
	}
}
